FBX SDK简单使用(一) |
您所在的位置:网站首页 › 3ds max切线 › FBX SDK简单使用(一) |
FBX SDK简单使用(一)简介 FBX是Autodesk的一个常用的跨平台的三维数据格式,应用很广泛,这里是官方API,这里是官方例子。FBX的安装可以参照这里,基本介绍可以参考这里。 查看FBX文件数据这是在整个使用过程中个人认为帮助很大的一个功能,3ds MAX中可以直接设置,在导出的时候可以选择二进制的格式或者ASCII的格式,如下图: 在FBX SDK中通过对FbxExporter设置可以得到一样的效果。 1234// FBX设置输出ASCII格式文件FbxExporter* fbxExporter = FbxExporter::Create(fbxManager, "");int fbxFormat = fbxManager->GetIOPluginRegistry()->FindWriterIDByDescription("FBX ascii(*.fbx)");bool exportStatus = fbxExporter->Initialize(fileOutput, fbxFormat, fbxManager->GetIOSettrings());在VS Code中查看输出的文件显示如下: FBX文件是以树(SceneTree)的形式进行存储的,以RootNode作为起始,在官方的例子中可以看出 通过遍历Node可以得到相应Node存储的数据,每个Node有对应的在FbxNodeAttribute枚举中的类型。例如eMesh,eSkeleton等。 常见概念Control Point 和 Polygon Vertex以3dsMax中最简单的Cube为例子,在正常格式下输出对应的Fbx得到的control point数量是8,polygon vertex数量是36,polygon数量是12。对应到Cube上,可以看到正常见到的Cube拥有8个顶点对应Control Point的数量,而正常box有6个面,在实际输出的时候,被分成了12个三角面,每个三角面对应一个polygon,而每个三角面三个顶点,因此polygon vertex的数量是12 * 3 = 36。每个polygon vertex可能拥有同一个位置,这时候是索引到同一个control point。 在Fbx SDK中通过以下代码获取 12345678910111213141516171819// 顶点序号int vertexIdx = 0;int polygonNum = mesh->GetPolygonCount();for(int i=0;iGetPolygonSize(i); for(int j=0;jGetPolygonVertex(i, j); ... ... vertexIdx++; }} Fbx Layer在FBX的结构中,法线,切线,颜色,uv等都是通过layer进行添加,挂载在对应的mesh上。我们可以看到如下类似的代码,在GetElementNormal(0)括号中0代表第一层,例如uv等可能有好几套,通过这里可以指定第几套。特别需要注意的是,在3dsMax中 12345678// 获取法线FbxGeometryElementNormal* vertexNormal = mesh->GetElementNormal(0);// 获取切线FbxGeometryElementTangent* vertexTangent = mesh->GetElementTangent(0); // 获取顶点色FbxGeometryElementVertexColor* vertexColor = mesh->GetElementVertexColor(0);// 获取UVFbxGeometryElementUV* vertexUV = mesh->GetElementUV(0);需要注意的是: 通过maxscript指令box()创建的盒子和直接在max场景中创建的盒子数据是不一样的,box()指令直接创建的盒子不带uv,没法通过代码生成tangent。 在Unity中导入切线数据,需要同时生成副法线数据,Unity中才可见。 Mapping ModeeByControlPoint 在这个模式下Layer的数据是通过控制点去添加的,每个顶点的数据和对应的控制点的数据相同,在这里用顶点和控制点的法线进行尝试,得到的结果如下,可以看到整个Cube的边缘显得十分的柔和。 对应效果: eByPolygonVertex 在这个模式下Layer的数据是通过顶点去添加的,在这里用顶点和控制点的法线进行尝试,得到的结果如下,可以看到整个Cube的边缘显得很锐利。 对应效果: 这是一种选择是否使用优化存储的模式,eDirect表示直接通过索引来获取相应的信息,对应数量与control point或者vertex相同,eIndexToDirect则会将相同数据合并,并通过control point或者vertex的二级索引指向需要的数据,这样重复数据能够指向同一个位置节省存储空间。 在eIndexToDirect中需要通过如下代码获取索引 1int index = vertexNormal->GetIndexArray().GetAt(vertexIdx);eDirect在FBX文件中显示如下 eIndexToDirect在FBX文件中显示如下 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |